package it.okkam.utility;

import it.okkam.costants.Costanti;
import it.okkam.strutturedati.ParticellaCatastale;
import it.okkam.strutturedati.Poligono;
import it.okkam.strutturedati.Punto;
import it.okkam.strutturedati.Vertice;

import java.util.List;
import java.util.Set;

import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.RDFVisitor;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;

public class FillModel {

	public Model fillModel(List<ParticellaCatastale> listaParticelleCatastali, String ontologiaCatasto){
		Model model = ModelFactory.createDefaultModel();
		ExtentParticelle exP = new ExtentParticelle();
		String ontologia = "http://www.okkam.it/ont/particella_catastale.owl#";
		model.setNsPrefix("pc", "http://www.okkam.it/ont/particella_catastale.owl#"); // set del prefisso
		
		for(ParticellaCatastale particella:listaParticelleCatastali){
			String particellaURI = null;
			String poligonoURI = null;
			String puntoURI = null;
			String verticeURI = null;
			String exMinURI = null;
			String exMaxURI = null;
			Utility uti = new Utility();
	
			
			String numeroEDenominatore = uti.getNumEDen(particella);
			particellaURI = uti.creaURIParticella(ontologiaCatasto, numeroEDenominatore, particella);
			/*if (particellaURI.equalsIgnoreCase("http://www.okkam.it/ont/particella_catastale.owl/giovo/castasto/pe/736")){
				System.out.println("beccato");
				System.out.println(particellaURI);
				System.out.println(particella.getTipologia());
				System.out.println("Numero: "+particella.getNumero()+ " denominatore: "+particella.getDenominatore() + " Numero Pertinenza: "+particella.getNumeroPertinenza());
			}*/
			exMaxURI = uti.cleanURI(particellaURI + "/exMax");
			exMinURI = uti.cleanURI(particellaURI + "/exMin");
			
						
			// questo blocco  e' da aggiungere a un metodo privato
			
			Costanti.setUriComuni();
			Resource particellaRisorsa = model.createResource(particellaURI);
			
			//add tipo 
			Property pTypeParticella = model.createProperty(ontologia,"Particella");
			particellaRisorsa.addProperty(RDF.type, pTypeParticella);
			
			String comuneURI = Costanti.uriComuni.get(particella.getComune());
			Resource comuneRisorsa = model.createResource(comuneURI);
			
			//add tipo 
			Property pTypeComune = model.createProperty(ontologia,"Comune");
			comuneRisorsa.addProperty(RDF.type, pTypeComune);
			
			comuneRisorsa.addProperty(RDFS.label, particella.getComune());
			particellaRisorsa.addProperty(S.haComuneCatastale, comuneRisorsa);
			particellaRisorsa.addProperty(S.haCodiceComuneCatastale, particella.getCodiceComune());
			particellaRisorsa.addProperty(S.haNumero, particella.getNumero());
			
			//add Denominatore
			if (particella.getDenominatore()!=null){
				particellaRisorsa.addProperty(S.haDenominatore, particella.getDenominatore());}
			
			
			// add Numero Pertinenza
			if (particella.getNumeroPertinenza()!=null){
				particellaRisorsa.addProperty(S.haNumeroPertinenza, particella.getNumero());
			}
			
			
			if (particella.getDenominatore()!=null){
				particellaRisorsa.addProperty(S.haDenominatore, particella.getDenominatore());}
			if (particella.getEdificialeFondiaria().equalsIgnoreCase("edificiale")){
				//text here caso EDIFICIALE
				particellaRisorsa.addProperty(S.haTipoRelazione, "edificiale");
			}
			else{
				//caso Fondiaria
				particellaRisorsa.addProperty(S.haTipoRelazione , "fondiaria");
			}
		
			if (particella.getTipologia().equals("C")){
				//caso PERTINENZA
				particellaRisorsa.addProperty(S.eDiTipo, "pertinenza");
			}
			if (particella.getTipologia().equals("P")){				
				//text here caso principale
				particellaRisorsa.addProperty(S.eDiTipo, "principale");
			}
	
			Poligono poligonoLetto = particella.getPoligono();
			
			Double[] extentMin= new Double[2];
			Double[] extentMax= new Double[2];
			extentMin = exP.getExtentMin(poligonoLetto);
			extentMax = exP.getExtentMax(poligonoLetto);
			Resource extentMinResource = model.createResource(exMinURI);
			Resource extentMaxResource = model.createResource(exMaxURI);
			
			//add tipo 
			Property pTypeEx = model.createProperty(ontologia,"Extent");
			extentMaxResource.addProperty(RDF.type, pTypeEx);
			//add tipo 
			extentMinResource.addProperty(RDF.type, pTypeEx);

			particellaRisorsa.addProperty(S.haExtentMin, extentMinResource);
			particellaRisorsa.addProperty(S.haExtentMax, extentMaxResource);
			extentMinResource.addProperty(SGeo.lat, model.createTypedLiteral(extentMin[0]));
			extentMinResource.addProperty(SGeo.long_, model.createTypedLiteral(extentMin[1]));
			extentMaxResource.addProperty(SGeo.lat, model.createTypedLiteral(extentMax[0]));
			extentMaxResource.addProperty(SGeo.long_, model.createTypedLiteral(extentMax[1]));
			

			
			poligonoURI = uti.creaURIPoligono(ontologiaCatasto, particella);
			
			Resource poligonoRisorsa = model.createResource(poligonoURI);
			
			//add tipo 
			Property pTypePoligono = model.createProperty(ontologia,"Poligono");
			poligonoRisorsa.addProperty(RDF.type, pTypePoligono);
			
			particellaRisorsa.addProperty(S.haPoligono, poligonoRisorsa);
			poligonoRisorsa.addProperty(S.poligonoDi, particellaRisorsa);
			Set<Vertice> listaVertici = poligonoLetto.getPoligono();
			
	
			for (Vertice verticeLetto: listaVertici){
				int ordine = verticeLetto.getCardinalita();
				if (ordine == 1){
					puntoURI = uti.creaURIPunto(ontologiaCatasto, particella.getCentro());
					Resource centroRisorsa = model.createResource(puntoURI);
					
					//add tipo 
					Property pTypePunto = model.createProperty(ontologia,"Point");
					centroRisorsa.addProperty(RDF.type, pTypePunto);
					
					centroRisorsa.addProperty(SGeo.lat, model.createTypedLiteral(particella.getCentro().getX()));
					centroRisorsa.addProperty(SGeo.long_, model.createTypedLiteral(particella.getCentro().getY()));
					poligonoRisorsa.addProperty(S.haCentro, centroRisorsa);}				
				
				Punto puntoLetto = verticeLetto.getVertice();
				puntoURI = uti.creaURIPunto(ontologiaCatasto, puntoLetto);
				verticeURI = uti.creaURIVertice(poligonoURI, puntoURI, ontologiaCatasto, Integer.toString(ordine));
				Resource verticeRisorsa = model.createResource(verticeURI);	
				
				//add tipo 
				Property pTypeVertice = model.createProperty(ontologia,"Vertice");
				verticeRisorsa.addProperty(RDF.type, pTypeVertice);
				
				Resource puntoRisorsa = model.createResource(puntoURI);
				
				//add tipo 
				Property pTypePoint = model.createProperty(ontologia,"Point");
				puntoRisorsa.addProperty(RDF.type, pTypePoint);
				
				puntoRisorsa.addProperty(SGeo.lat, model.createTypedLiteral(puntoLetto.getX()));
				puntoRisorsa.addProperty(SGeo.long_, model.createTypedLiteral(puntoLetto.getY()));
				verticeRisorsa.addProperty(S.haPunto, puntoRisorsa);
				puntoRisorsa.addProperty(S.puntoDi, verticeRisorsa);
				verticeRisorsa.addProperty(S.haNumeroOrdine, Integer.toString(ordine));
				poligonoRisorsa.addProperty(S.haVertice, verticeRisorsa);
				verticeRisorsa.addProperty(S.verticeDi, poligonoRisorsa);
			
			}
			
		}
		return model;}

}

